// 文档可参考https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.udpclient?view=net-5.0
// udp没有严格的server和client概念，在C#中udp相关功能全部集成在UdpClient类中
using System.Net;
using System.Net.Sockets;
using System.Text


// 参数
int localport = 10000;
int remoteport = 10001;
string localaddress = "localaddress";
string remoteaddress = "remoteaddress";
string sendstring = "I am a robot";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendstring);  // send方法只支持byte格式，需要将发送的数据转化为byte


//  UDP消息发送端
//  方法一
UdpClient udpSenderA = new UdpClient(localport);  // 初始化UdpClient，指定本地端口
udpSenderA.Connect(remoteaddress, remoteport);  // 绑定远程地址和端口，该方法可以被多次调用
udpSenderA.Send(sendBytes, sendBytes.Length);  // 发送数据时还需要指定数据长度

//  方法二
UdpClient udpSenderB = new UdpClient(remoteaddress, remoteport);  // 在发送消息时可以直接指定远程地址和其对应端口，调用此方法时本地端口将自动选择
udpSenderB.Send(sendBytes, sendBytes.Length);

//  方法三
UdpClient udpSenderC = new UdpClient(localport);
udpSenderC.Send(sendBytes, sendBytes.Length, remoteaddress, remoteport);  // 可以在每次的send方法中指定远程地址和端口。注意在调用Connect方法或者使用方法二的初始化方法后，send方法将不可再指定地址和端口


//  UDP消息接收端
UdpClient udpReceiver = new UdpClient(localport);  // 初始化udpclient，指定本地端口
IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);  // 发送消息的远程地址和端口
byte[] receiveBytes = udpReceiver.Receive(ref remoteIPEndPoint);  // 接收数据，并覆盖remoteIPEndPoint为数据发送端的地址和端口。如果调用Connect方法则仅接收来自绑定地址的数据，否则任意数据都可接收
string receiveString = Encoding.ASCII.GetString(receiveBytes);  // 将接收到的byte转化为string格式